package com.wry.wry_test.utils;

import com.wry.wry_test.model.enums.FileTypeEnum;

import java.io.FileInputStream;
import java.util.Arrays;

/**
 * @Author: wangrongyi
 * @Date: 2024/10/8 10:49
 * @Description: 文件类型识别工具类
 */
public class FileTypeUtil {


    /**
     * 根据路径获取文件类型枚举
     *
     * @param filePath 文件路径
     * @return 文件类型枚举值
     */
    public static FileTypeEnum getFileType(String filePath) {
        try (FileInputStream fis = new FileInputStream(filePath)) {
            byte[] magicBytes = new byte[FileTypeEnum.MAX_HEAD_LENGTH];
            fis.read(magicBytes, 0, FileTypeEnum.MAX_HEAD_LENGTH);
            String fileCode = bytesToHex(magicBytes);
            return FileTypeEnum.getByHexCode(fileCode);
        } catch (Exception e) {
            throw new RuntimeException("获取文件类型失败", e);
        }
    }


    /**
     * 根据路径获取文件类型枚举
     *
     * @param bytes 文件字节数组
     * @return 文件类型枚举值
     */
    public static FileTypeEnum getFileType(byte[] bytes) {
        byte[] magicBytes = Arrays.copyOf(bytes, FileTypeEnum.MAX_HEAD_LENGTH);
        String fileCode = bytesToHex(magicBytes);
        return FileTypeEnum.getByHexCode(fileCode);
    }


    /**
     * 获取文件类型
     *
     * @param bytes 文件字节数组
     * @return 文件类型
     */
    public static String getFileTypeStr(byte[] bytes) {
        FileTypeEnum fileEnum = getFileType(bytes);
        return fileEnum.getType();
    }

    /**
     * 获取文件类型
     *
     * @param filePath 文件路径
     * @return 文件类型
     */
    public static String getFileTypeStr(String filePath) {
        FileTypeEnum fileEnum = getFileType(filePath);
        return fileEnum.getType();
    }

    /**
     * 将文件头转换成16进制字符串
     *
     * @param bytes 文件头字节
     * @return 16进制字符串
     */
    public static String bytesToHex(byte[] bytes) {
        StringBuilder hexString = new StringBuilder();
        for (byte b : bytes) {
            System.out.print(b + "  ");

            String hex = Integer.toHexString(0xff & b);
            if (hex.length() == 1) {
                hexString.append('0');
            }
            hexString.append(hex);
        }
        System.out.println(hexString);
        return hexString.toString().toUpperCase();
    }


}
